GPS loggers are not the same for successful and failed breeders so they have to be processed differently before being merged. Moreover, data from 2015 and 2018 have different formats and different constraints so they are also processed separately. This file aims at formatting the data and compare results for 2015 when cleaning trips based on different threshold parameters.
Loggers deployed on successful breeders are IgotU GPS. They give LOCAL TIME in UTC (GMT+5) and record locations every 5 minutes.
library(fields)
library(maptools)
library(maps)
library(stringr)
library(xlsx)
library(plotrix)
library(pastecs)
library(kableExtra)
library(plyr)
library(lme4)
library(simr)
source("R scripts/Functions.R")
#Coordinates of the colony
colony<-data.frame(Longitude =77.52356,Latitude=-37.8545)
##Import data for successful birds (classical GPS)
success.2015<-read.table("RawData/ams_yna_2015-16_gps_success.txt",header=T,sep="\t")
success.2015$Status<-as.factor("success")
success.2015$DateTime<-as.POSIXct(paste(strptime(success.2015$Date,format="%d/%m/%Y"),
success.2015$Time,sep=" "),tz="")
success.2015<-success.2015[,c("Logger.ID","Status","DateTime","Longitude","Latitude","Speed","Altitude")]
#distance between location and colony
success.2015$Distmax<-as.vector(rdist.earth(success.2015[,c("Longitude","Latitude")],
colony[1,c("Longitude","Latitude")],miles=F))
names(success.2015)[1]<-"ID"
success.2015$Distadj<-0
success.2015$Difftime<-0
#calculate distance between 2 consecutive points and time elapsed between 2 consecutive points
for ( n in 2:nrow(success.2015)){
success.2015$Distadj[n]<-rdist.earth(success.2015[n,c("Longitude","Latitude")],
success.2015[n-1,c("Longitude","Latitude")],miles=F)
success.2015$Difftime[n]<-difftime(success.2015$DateTime[n],success.2015$DateTime[n-1],units="mins")
}
#remove time difference when changing individuals
success.2015$Difftime[which(success.2015$Difftime<0)]<-0
Loggers deployed on failed breeders are GPS-UHF Ecotone. They give time in GMT so 5h have to be added to obtain local time (UTC=GMT+5).They record locations every 5-15 minutes, depending on weather conditions. They provide more gaps in the data
##Import data for failed birds (GPS-UHF)
fail.2015<-read.table("RawData/ams_yna_2015-16_gps_fail.txt",header=T,sep="\t")
fail.2015$Date<-paste(fail.2015$Year,fail.2015$Month,fail.2015$Day,sep="/")
fail.2015$Time<-paste(fail.2015$Hour,fail.2015$Minute,fail.2015$Second,sep=":")
fail.2015$Status<-as.factor("fail")
fail.2015$DateTime<-as.POSIXct(paste(strptime(fail.2015$Date,format="%Y/%m/%d"),fail.2015$Time,sep=" "),tz="UTC")
fail.2015$DateTime<-fail.2015$DateTime + 5*3600
fail.2015<-fail.2015[,c("Logger.ID","Status","DateTime","Longitude","Latitude","Speed","Altitude","In.range")]
#when "in.range" is true, locations are set to colony coordinates
fail.2015$Longitude[which(is.na(fail.2015$Longitude)==T & fail.2015$In.range==1)]<-colony$Longitude
fail.2015$Latitude[which(is.na(fail.2015$Latitude)==T & fail.2015$In.range==1)]<-colony$Latitude
fail.2015<-fail.2015[!is.na(fail.2015$Latitude)==T,]
#distance between location and colony
fail.2015$Distmax<-NA
fail.2015$Distmax<-as.vector(rdist.earth(fail.2015[,c("Longitude","Latitude")],
colony[1,c("Longitude","Latitude")],miles=F))
fail.2015$Distmax[fail.2015$In.range==1]<-0
names(fail.2015)[1]<-"ID"
fail.2015<-fail.2015[,-8]
fail.2015$Distadj<-0
#calculate distance between 2 consecutive points and time elapsed between 2 consecutive points
fail.2015$Difftime<-0
for (n in 2:nrow(fail.2015)){
fail.2015$Distadj[n]<-rdist.earth(fail.2015[n,c("Longitude","Latitude")],
fail.2015[n-1,c("Longitude","Latitude")],miles=F)
fail.2015$Difftime[n]<-difftime(fail.2015$DateTime[n],fail.2015$DateTime[n-1],units="mins")
}
fail.2015$Difftime[which(fail.2015$Difftime<0)]<-0
Parameters to define a trip are based on distance to the colony, number of locations out of the colony and duration. They are different for data from 2015 to account for duty cycles in loggers tracking successful breeders in 2018.
dataset.2015<-rbind(success.2015,fail.2015)
dataset.2015<-dataset.2015[duplicated(dataset.2015$DateTime)==FALSE,] # remove duplicated points with the same date and time
datasetTravelNb<-"NA"
dataset.2015$PathLength<-0
dist.thres<-1 #distance threshold (in km)
last.dist<-10 #distance threshold (in km) when having only one location between 2 trips
row.thres<- 12 #number of rows constituting a trip (corresponding to minimum 1h)
dur.thres<-120 #min duration of a trip
diff.thres<-360 #max difftime in a trip
date.max<-as.POSIXct("2015-12-22 12:00:00", format="%F %H:%M:%S",tz="UTC")
#Define trip number within each individual
ALL.2015<-define_trips(dataset.2015) #function from source file
#summarize raw trips by individuals or status
dist.max.all.trips.2015.ind<-raw_trips_summary_ind(ALL.2015) #function from source file
dist.max.all.trips.2015.status<-raw_trips_summary_status(ALL.2015) #function from source file
#clean trips and give summary by individuals or status
summary.clean.trips.2015.ind<-clean_trips_summary_ind(ALL.2015) #function from source file
summary.clean.trips.2015.status<-clean_trips_summary_status(ALL.2015) #function from source file
#clean trips and give locations of selected trips
clean.trips.loc.2015<-clean_trips_locations(ALL.2015)
The first table shows the summary of trip characteristics with raw data. The second one shows the summary of trip characteristics with a minimum distance of 1km, a minimum duration of 120, gaps of less than 360 and a minimum of 12 number of locations to define a trip.
| Status | NbInd | NbTravel | MeanDist | SDDist | MinDist | MaxDist | MeanDur | SDDur | MinTripDur | MaxTripDur | MinmaxDiff | MaxmaxDiff | MeanTotPath | MinTotPath | MaxTotPath |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| success | 8 | 24 | 340.4639 | 39.92386 | 155.250865 | 852.6335 | 52.79950 | 6.405953 | 17.417778 | 171.0675 | 0.1633333 | 0.6908333 | 1098.5590 | 407.3176 | 3205.429 |
| fail | 13 | 35 | 460.4098 | 64.12813 | 0.234768 | 1229.8146 | 83.69254 | 12.720925 | 3.783333 | 339.7928 | 0.1833333 | 94.5166667 | 898.4941 | 0.0000 | 3473.809 |
| Status | NbInd | NbTravel | MeanDist | SDDist | MinDist | MaxDist | MeanDur | SDDur | MinTripDur | MaxTripDur | MinmaxDiff | MaxmaxDiff | MeanTotPath | MinTotPath | MaxTotPath |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| success | 8 | 23 | 336.4499 | 41.48781 | 155.2509 | 852.6335 | 53.51965 | 6.648387 | 17.417778 | 171.0675 | 0.1633333 | 0.6908333 | 1106.5136 | 407.31755 | 3205.429 |
| fail | 11 | 21 | 420.9659 | 86.16949 | 28.6290 | 1229.8146 | 60.63340 | 11.501622 | 3.783333 | 163.0244 | 0.2666667 | 5.3666667 | 732.1894 | 58.46149 | 2313.828 |
In the plots, all black dots represent trips/data that have been excluded. All colored trips are the selected ones.
reso <- 10 * 60 #time resolution between 2 points in seconds
new.trip<-NULL
loc.interpolated.2015<-NULL
id<-unique(clean.trips.loc.2015$ID)
#interpolate data for each individual separately
for (x in 1:length(id)){
sub<-subset(clean.trips.loc.2015,clean.trips.loc.2015$ID==id[x])
trip<-unique(sub$TravelNb)
#interpolate data for each trip separately
for (y in 1:length(trip)){
sub.trip<-subset(sub,sub$TravelNb==trip[y])
sub.trip$TimeSinceOrigin<-rep(0,nrow(sub.trip))
for (z in 1:nrow(sub.trip)){
sub.trip$TimeSinceOrigin[z]<-difftime(sub.trip$DateTime[z],sub.trip$DateTime[1],units="sec")
}
# Resampling of long and lat with regular time intervals
sub.lat1 <- regul(x=sub.trip$TimeSinceOrigin, y=sub.trip$Latitude,
n=round((max(sub.trip$TimeSinceOrigin)/reso),0),
deltat=reso, methods="linear",xmin=0,units="sec")
sub.lon1 <- regul(x=sub.trip$TimeSinceOrigin, y=sub.trip$Longitude,
n=round((max(sub.trip$TimeSinceOrigin)/reso),0),
deltat=reso, methods="linear",xmin=0,units="sec")
new.sub <- data.frame(Longitude=sub.lon1[[2]]$Series, Latitude=sub.lat1[[2]]$Series, Time=as.vector(sub.lon1[[1]]),
DateTime=sub.trip$DateTime[1]+as.vector(sub.lon1[[1]]),TravelNb=trip[y])
#Recreate a dataframe with individual and trip characteristics
new.sub$ID<-id[x]
new.sub$Status<-rep(unique(sub$Status),nrow(new.sub))
new.sub$Distmax<-as.vector(rdist.earth(new.sub[,c("Longitude","Latitude")],
colony[1,c(1,2)],miles=F))
new.sub$Difftime<-c(0,difftime(new.sub$DateTime[2:nrow(new.sub)],new.sub$DateTime[1:nrow(new.sub)-1],units="mins"))
new.sub$Distadj<-0
for (z in 2:nrow(new.sub)){
new.sub$Distadj[z]<-rdist.earth(new.sub[z,c("Longitude","Latitude")],
new.sub[z-1,c("Longitude","Latitude")], miles=F)
}
new.trip<-rbind(new.trip,new.sub)
}
}
#create a new global dataset with interpolated data
loc.interpolated.2015<-new.trip[,c("ID","Status","TravelNb","DateTime","Longitude","Latitude",
"Distmax","Difftime","Distadj")]
#save(loc.interpolated.2015,file="NewlyCreatedData/clean_interp_loc_2015.RData")
summary.trips.interp1<-ddply(loc.interpolated.2015,.(ID,Status,TravelNb),summarize,DistmaxIndTrip=max(Distmax),
TripDurIndTrip=sum(Difftime)/60,TotPathIndTrip=sum(Distadj))
summary.trips.interp2<-ddply(summary.trips.interp1,.(ID,Status),summarize,NbTrips=length(DistmaxIndTrip),
DistmaxInd=mean(DistmaxIndTrip),
TripDurInd=mean(TripDurIndTrip),TotPathInd=mean(TotPathIndTrip))
summary.trips.interp<-ddply(summary.trips.interp2,.(Status),summarize,
NbTrip=mean(NbTrips),NbTripSE=std.error(NbTrips,na.rm=T),
Distmax=mean(DistmaxInd),DistmaxSE=std.error(DistmaxInd,na.rm=T),
TripDur=mean(TripDurInd),TripDurSE=std.error(TripDurInd,na.rm=T),
TotPath=mean(TotPathInd),TotPathSE=std.error(TotPathInd,na.rm=T))
The table shows the summary of trip characteristics with interpolated data from clean trips with a minimum distance of 1km, a minimum duration of 120, gaps of less than 360 and a minimum of 12 number of locations to define a trip with a time resolution of 600 for interpolation.
| Status | NbTrip | NbTripSE | Distmax | DistmaxSE | TripDur | TripDurSE | TotPath | TotPathSE |
|---|---|---|---|---|---|---|---|---|
| success | 3.000000 | 0.3779645 | 375.9784 | 47.55268 | 57.05174 | 10.02957 | 1187.30 | 202.4147 |
| fail | 1.916667 | 0.3785605 | 481.4227 | 105.06258 | 67.54514 | 14.82000 | 1332.87 | 275.4427 |
Linear mixed models are applied to test whether the trip variables are different between failed and successful breeders as well as power analyses.
## Analysis of Variance Table
## npar Sum Sq Mean Sq F value
## Status 1 3.5706 3.5706 0.1216
## Analysis of Variance Table
## npar Sum Sq Mean Sq F value
## Status 1 0.0011549 0.0011549 2e-04
## Analysis of Variance Table
## npar Sum Sq Mean Sq F value
## Status 1 0.98179 0.98179 0.0098
## Simulating: | |Simulating: |= |Simulating: |== |Simulating: |=== |Simulating: |==== |Simulating: |===== |Simulating: |====== |Simulating: |======= |Simulating: |======== |Simulating: |========= |Simulating: |========== |Simulating: |=========== |Simulating: |============ |Simulating: |============= |Simulating: |============== |Simulating: |=============== |Simulating: |================ |Simulating: |================= |Simulating: |================== |Simulating: |=================== |Simulating: |==================== |Simulating: |===================== |Simulating: |====================== |Simulating: |======================= |Simulating: |======================== |Simulating: |========================= |Simulating: |========================== |Simulating: |=========================== |Simulating: |============================ |Simulating: |============================= |Simulating: |============================== |Simulating: |=============================== |Simulating: |================================ |Simulating: |================================= |Simulating: |================================== |Simulating: |=================================== |Simulating: |==================================== |Simulating: |===================================== |Simulating: |====================================== |Simulating: |======================================= |Simulating: |======================================== |Simulating: |========================================= |Simulating: |========================================== |Simulating: |=========================================== |Simulating: |============================================ |Simulating: |============================================= |Simulating: |============================================== |Simulating: |=============================================== |Simulating: |================================================ |Simulating: |================================================= |Simulating: |================================================== |Simulating: |=================================================== |Simulating: |==================================================== |Simulating: |===================================================== |Simulating: |====================================================== |Simulating: |======================================================= |Simulating: |======================================================== |Simulating: |========================================================= |Simulating: |========================================================== |Simulating: |=========================================================== |Simulating: |============================================================ |Simulating: |============================================================= |Simulating: |============================================================== |Simulating: |=============================================================== |Simulating: |================================================================ |Simulating: |================================================================= |Simulating: |==================================================================|
## Power for predictor 'Status', (95% confidence interval):
## 6.60% ( 5.14, 8.32)
##
## Test: Likelihood ratio
##
## Based on 1000 simulations, (1 warning, 0 errors)
## alpha = 0.05, nrow = 47
##
## Time elapsed: 0 h 2 m 28 s
##
## nb: result might be an observed power calculation
## Simulating: | |Simulating: |= |Simulating: |== |Simulating: |=== |Simulating: |==== |Simulating: |===== |Simulating: |====== |Simulating: |======= |Simulating: |======== |Simulating: |========= |Simulating: |========== |Simulating: |=========== |Simulating: |============ |Simulating: |============= |Simulating: |============== |Simulating: |=============== |Simulating: |================ |Simulating: |================= |Simulating: |================== |Simulating: |=================== |Simulating: |==================== |Simulating: |===================== |Simulating: |====================== |Simulating: |======================= |Simulating: |======================== |Simulating: |========================= |Simulating: |========================== |Simulating: |=========================== |Simulating: |============================ |Simulating: |============================= |Simulating: |============================== |Simulating: |=============================== |Simulating: |================================ |Simulating: |================================= |Simulating: |================================== |Simulating: |=================================== |Simulating: |==================================== |Simulating: |===================================== |Simulating: |====================================== |Simulating: |======================================= |Simulating: |======================================== |Simulating: |========================================= |Simulating: |========================================== |Simulating: |=========================================== |Simulating: |============================================ |Simulating: |============================================= |Simulating: |============================================== |Simulating: |=============================================== |Simulating: |================================================ |Simulating: |================================================= |Simulating: |================================================== |Simulating: |=================================================== |Simulating: |==================================================== |Simulating: |===================================================== |Simulating: |====================================================== |Simulating: |======================================================= |Simulating: |======================================================== |Simulating: |========================================================= |Simulating: |========================================================== |Simulating: |=========================================================== |Simulating: |============================================================ |Simulating: |============================================================= |Simulating: |============================================================== |Simulating: |=============================================================== |Simulating: |================================================================ |Simulating: |================================================================= |Simulating: |==================================================================|
## Power for predictor 'Status', (95% confidence interval):
## 7.50% ( 5.94, 9.31)
##
## Test: Likelihood ratio
##
## Based on 1000 simulations, (21 warnings, 0 errors)
## alpha = 0.05, nrow = 47
##
## Time elapsed: 0 h 2 m 6 s
##
## nb: result might be an observed power calculation
## Simulating: | |Simulating: |= |Simulating: |== |Simulating: |=== |Simulating: |==== |Simulating: |===== |Simulating: |====== |Simulating: |======= |Simulating: |======== |Simulating: |========= |Simulating: |========== |Simulating: |=========== |Simulating: |============ |Simulating: |============= |Simulating: |============== |Simulating: |=============== |Simulating: |================ |Simulating: |================= |Simulating: |================== |Simulating: |=================== |Simulating: |==================== |Simulating: |===================== |Simulating: |====================== |Simulating: |======================= |Simulating: |======================== |Simulating: |========================= |Simulating: |========================== |Simulating: |=========================== |Simulating: |============================ |Simulating: |============================= |Simulating: |============================== |Simulating: |=============================== |Simulating: |================================ |Simulating: |================================= |Simulating: |================================== |Simulating: |=================================== |Simulating: |==================================== |Simulating: |===================================== |Simulating: |====================================== |Simulating: |======================================= |Simulating: |======================================== |Simulating: |========================================= |Simulating: |========================================== |Simulating: |=========================================== |Simulating: |============================================ |Simulating: |============================================= |Simulating: |============================================== |Simulating: |=============================================== |Simulating: |================================================ |Simulating: |================================================= |Simulating: |================================================== |Simulating: |=================================================== |Simulating: |==================================================== |Simulating: |===================================================== |Simulating: |====================================================== |Simulating: |======================================================= |Simulating: |======================================================== |Simulating: |========================================================= |Simulating: |========================================================== |Simulating: |=========================================================== |Simulating: |============================================================ |Simulating: |============================================================= |Simulating: |============================================================== |Simulating: |=============================================================== |Simulating: |================================================================ |Simulating: |================================================================= |Simulating: |==================================================================|
## Power for predictor 'Status', (95% confidence interval):
## 7.90% ( 6.30, 9.75)
##
## Test: Likelihood ratio
##
## Based on 1000 simulations, (2 warnings, 0 errors)
## alpha = 0.05, nrow = 47
##
## Time elapsed: 0 h 2 m 31 s
##
## nb: result might be an observed power calculation